#ifndef _DYNAMICARRAY_H
#define _DYNAMICARRAY_H

#include <cstddef>
#include <limits.h>

using ElementType = int;
class DynamicArray
{
public:
    DynamicArray();
    DynamicArray(const DynamicArray& a);
    DynamicArray& operator=(const DynamicArray& a);
    ~DynamicArray();

    //插入
    //尾插法
    void InsertTail(const ElementType & element);
    //头插法
    void InsertHead(const ElementType &element);

    //中间插入
    void InsertByIndex(const ElementType& element,size_t index);
    
    //删除
    ////按位置删除
    void RemoveByIndex(size_t index);
    //按值删除
    void RemoveByElement(const ElementType & element);

    //查找
    //按位置查找
    ElementType* FindByIndex(size_t index);

    //按值查找
    DynamicArray FindByElement(const ElementType& element);

    //修改
    //按位置修改
    void UpdateByIndex(size_t index,const ElementType &newValue);
    //按值修改
    void UpdateByElement(const ElementType &oldValue,const ElementType &newValue);
    
    ElementType& operator[](int index);
    
    void Sort();    //排序算法  

    void Duplicate();   //去重算法

    //合并:两个有序数列合并成一个新的有序数列
    DynamicArray Merge(const DynamicArray& a);

    //取交集
    DynamicArray FdInterSctn(const DynamicArray &a);

    //并集
    DynamicArray FindUnionSet(const DynamicArray &a);

    //取补集
    DynamicArray Findpifference(const DynamicArray &a);

    //判断两个数列是否相等
    bool operator==(const DynamicArray&a);

    //二分法,没找到返回ULONG_MAX
    size_t BinarySearch(const ElementType & element);

    //判断一个数列是不是另一个数列的子数列
    bool Contains(const DynamicArray &a);

    //判断一个数列是不是连续子序列
    bool ContnsContains(const DynamicArray &a);
    //获取子序列
    DynamicArray SubSquence(size_t index,size_t len);

    void show(); 
private:
    size_t partition(size_t start, size_t end);//分组函数
    void FastSort(size_t start,size_t end,size_t CurDepth,size_t MaxDepth);
    void InsertSort(size_t start,size_t end);   //插入排序
    void ReSize(size_t capacity);
    ElementType *array;
    size_t capacity;
    size_t size;



    void (*Free)(void *);//释放对象的函数指针
    bool (*Compare)(void*,void*);//比较大小的指针
    void (*Print)(void *)


};


#endif